Add debugging code to highlight a gdkwindow.
authorRichard Hult <richard@imendio.com>
Sat, 16 Feb 2008 00:27:29 +0000 (00:27 +0000)
committerRichard Hult <rhult@src.gnome.org>
Sat, 16 Feb 2008 00:27:29 +0000 (00:27 +0000)
2008-02-16  Richard Hult  <richard@imendio.com>

* gdk/quartz/gdkprivate-quartz.h:
* gdk/quartz/gdkwindow-quartz.c: Add debugging code to highlight a
gdkwindow.

svn path=/trunk/; revision=19587

ChangeLog
gdk/quartz/gdkprivate-quartz.h
gdk/quartz/gdkwindow-quartz.c

index b7851a982c32188ad4b336423d2f1d4b6ac63e3e..5b2188bd4cab06ca77e75ec9e84424438d3dfb72 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2008-02-16  Richard Hult  <richard@imendio.com>
+
+       * gdk/quartz/gdkprivate-quartz.h:
+       * gdk/quartz/gdkwindow-quartz.c: Add debugging code to highlight a
+       gdkwindow.
+
 2008-02-15  Matthias Clasen  <mclasen@redhat.com>
 
        * configure.in: Go back to 2.13.0 as version for now,
index e322e43405097e619bab08fe033b9f6f3ce2ed6c..b79663baa67f4681627e5fc4afa57bd2161f419d 100644 (file)
@@ -144,6 +144,7 @@ void       _gdk_quartz_window_attach_to_parent      (GdkWindow *window);
 void       _gdk_quartz_window_detach_from_parent    (GdkWindow *window);
 void       _gdk_quartz_window_did_become_main       (GdkWindow *window);
 void       _gdk_quartz_window_did_resign_main       (GdkWindow *window);
+void       _gdk_quartz_window_debug_highlight       (GdkWindow *window);
 
 /* Events */
 void         _gdk_quartz_events_update_focus_window    (GdkWindow *new_window,
index 6349ebc44f6b25f046b297c95da7c658b9a243ec..bbcc18199a3767ed63d3c38b6cebe452eb62be79 100644 (file)
@@ -478,6 +478,87 @@ get_default_title (void)
   return title;
 }
 
+static void
+get_ancestor_coordinates_from_child (GdkWindow *child_window,
+                                    gint       child_x,
+                                    gint       child_y,
+                                    GdkWindow *ancestor_window, 
+                                    gint      *ancestor_x, 
+                                    gint      *ancestor_y)
+{
+  GdkWindowObject *child_private = GDK_WINDOW_OBJECT (child_window);
+  GdkWindowObject *ancestor_private = GDK_WINDOW_OBJECT (ancestor_window);
+
+  while (child_private != ancestor_private)
+    {
+      child_x += child_private->x;
+      child_y += child_private->y;
+
+      child_private = child_private->parent;
+    }
+
+  *ancestor_x = child_x;
+  *ancestor_y = child_y;
+}
+
+void
+_gdk_quartz_window_debug_highlight (GdkWindow *window)
+{
+  GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
+  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+  gint x, y;
+  GdkWindow *toplevel;
+  gint tx, ty;
+  static NSWindow *debug_window;
+  static NSRect old_rect;
+  NSRect rect;
+
+  if (window == _gdk_root)
+    return;
+
+  if (window == NULL)
+    return;
+
+  toplevel = gdk_window_get_toplevel (window);
+  get_ancestor_coordinates_from_child (window, 0, 0, toplevel, &x, &y);
+
+  gdk_window_get_origin (toplevel, &tx, &ty);
+  x += tx;
+  y += ty;
+
+  rect =  NSMakeRect (x,
+                      _gdk_quartz_window_get_inverted_screen_y (y + impl->height),
+                      impl->width, impl->height);
+
+  if (debug_window &&
+      rect.origin.x == old_rect.origin.x &&
+      rect.origin.y == old_rect.origin.y &&
+      rect.size.width == old_rect.size.width &&
+      rect.size.height == old_rect.size.height)
+    {
+      return;
+    }
+
+  old_rect = rect;
+
+  if (debug_window)
+    [debug_window close];
+
+  debug_window = [[NSWindow alloc] initWithContentRect:rect
+                                             styleMask:NSBorderlessWindowMask
+                                              backing:NSBackingStoreBuffered
+                                                defer:NO];
+
+  [debug_window setBackgroundColor:[NSColor redColor]];
+  [debug_window setAlphaValue:0.4];
+  [debug_window setOpaque:NO];
+  [debug_window setReleasedWhenClosed:YES];
+  [debug_window setIgnoresMouseEvents:YES];
+  [debug_window setLevel:NSFloatingWindowLevel];
+
+  [debug_window orderFront:nil];
+}
+
 gboolean
 _gdk_quartz_window_is_ancestor (GdkWindow *ancestor,
                                 GdkWindow *window)
@@ -2525,6 +2606,7 @@ gdk_window_set_decorations (GdkWindow       *window,
           new_mask != NSBorderlessWindowMask)
         {
           rect = [NSWindow frameRectForContentRect:rect styleMask:new_mask];
+
         }
       else if (old_mask != NSBorderlessWindowMask &&
                new_mask == NSBorderlessWindowMask)